package cn.gorit.user.service;

import cn.gorit.common.enums.ResultEnums;
import cn.gorit.common.enums.StateEnums;
import cn.gorit.common.exception.UserException;
import cn.gorit.common.lang.Result;
import cn.gorit.dto.user.SubDto;
import cn.gorit.dto.user.SubListDto;
import cn.gorit.entity.user.User;
import cn.gorit.mapper.user.SubMapper;
import cn.gorit.mapper.user.UserMapper;
import cn.gorit.utils.Page;
import cn.gorit.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @version v1.0
 * @Classname SubscribeService
 * @Description 粉丝 订阅服务
 * @Author Gorit
 * @Created by 2021/3/8 23:57
 * @IDLE IntelliJ IDEA
 **/
@Service
public class SubscribeService {

    @Autowired
    private SubMapper subMapper;

    @Autowired
    private UserMapper userMapper;

    // 添加订阅
    @Transactional(rollbackFor = Exception.class)
    public Result<Object> sub(SubDto dto) {
        if (dto.getCurUserId().equals(dto.getSubedUserId()))
            return new Result<>(ResultEnums.SUB_FAILED.getCode(),"你不能关注你自己！！！");
        String subId = dto.getCurUserId() + "-" + dto.getSubedUserId(); // 当前订阅用户的 ID 号
        String subedId = this.reverseSubId(subId); // 被订阅者的 ID 号
        dto.setSubId(subId);
        // 查询是否已有的
        int count = subMapper.getByUserId(subedId);
        if (count == 0) {
            subMapper.add_sub(dto);
        }
        // 回关逻辑处理
        if (count == 1) {
            try {
                subMapper.add_sub(dto);
            } catch (Exception e) {
                throw new UserException("你不能重复订阅");
            } finally {
                dto.setFollowMe(StateEnums.FOLLOW_USER.getCode()); // 设置双向回关
                subMapper.updateSubState(dto);
                dto.setSubId(subedId);
                subMapper.updateSubState(dto);
            }
        }
        return new Result<>(ResultEnums.SUB_SUCCESS.getCode(),ResultEnums.SUB_SUCCESS.getMsg());
    }

    // 取消订阅为根据 ID 取消订阅，
    public Result<Object> can_sub(String subId) {
        subMapper.cancel_sub(subId);
        // 修改订阅状态
        SubDto dto = new SubDto();
        dto.setSubId(reverseSubId(subId));
        dto.setFollowMe(StateEnums.CANCEL_FOLLOW_USER.getCode());
        subMapper.updateSubState(dto);
        return new Result<>(ResultEnums.CANCEL_SUB_SUCCESS.getCode(),ResultEnums.CANCEL_SUB_SUCCESS.getMsg());
    }

    private String reverseSubId(String subId) {
        String[] res = subId.split("-");
        return res[1] + "-" + res[0];
    }

    // 分页查询我的关注列表：PS 必须添加查询参数，不然无法获得数据
    public Result<Page<SubListDto>> getSubList(Page<SubListDto> page) {
        // 查询参数校验工作
        String curUserId = (String) page.getParams().get("curUserId");
        if (StringUtils.isNotBlank(curUserId)) {
            // 查询数据
            List<SubListDto> useList = subMapper.getSubByPage(page);
            System.out.println(useList);
            page.setList(useList);
            // 查询总数
            int totalCount = subMapper.getSubCountByPage(curUserId);
            page.setTotalCount(totalCount);
            return new Result<>(ResultEnums.QUERY_SUCCESS.getCode(),ResultEnums.QUERY_SUCCESS.getMsg(),page);
        }
        return new Result<>(ResultEnums.PARAMS_ERROR.getCode(),"请检查查询参数 curUserId 是否有效");
    }

    // 分页查询粉丝列表
    public Result<Page<SubListDto>> getFansList(Page<SubListDto> page) {
        String subedUserId = (String) page.getParams().get("subedUserId");
        if (StringUtils.isNotBlank(subedUserId)) {
            // 查询数据
            List<SubListDto> useList = subMapper.getFansByPage(page);
            page.setList(useList);
            // 查询总数
            int totalCount = subMapper.getFansCountByPage(subedUserId);
            page.setTotalCount(totalCount);
            return new Result<>(ResultEnums.QUERY_SUCCESS.getCode(),ResultEnums.QUERY_SUCCESS.getMsg(),page);
        }
        return new Result<>(ResultEnums.PARAMS_ERROR.getCode(),"请检查查询参数 subedUserId 是否有效");
    }

    // 获取用户信息
    public Result<User> getUserDetail(String userId) {
        return new Result<>(ResultEnums.QUERY_SUCCESS.getCode(),ResultEnums.QUERY_SUCCESS.getMsg(),userMapper.getInfoById(userId));
    }

    // 获取订阅状态
    public Result<Object> getSubBySubId(String subId) {
        SubDto dto = subMapper.getSubById(subId);
        if (dto == null)
            return new Result<>(ResultEnums.NOT_FOUND.getCode(),ResultEnums.NOT_FOUND.getMsg(),"");
        return new Result<>(ResultEnums.QUERY_SUCCESS.getCode(),ResultEnums.QUERY_SUCCESS.getMsg(),dto);
    }
}
